package cn.wlh.learn.webmagic.pipeline;

import cn.hutool.core.util.StrUtil;
import cn.hutool.log.Log;
import cn.hutool.log.LogFactory;

import java.io.InputStream;
import java.net.URL;

/**
 * 适配基础类，提取公共操作。
 * 把URL -> fileName。
 * 打印日志。
 */
public abstract class AdapterDownLoadConversoinPipeline extends BaseDownLoadConversoinPipeline{
    private final static Log logger = LogFactory.get();
    /**
     * @see AdapterDownLoadConversoinPipeline#setUsePath(boolean)
     */
    private boolean usePath = false;
    /**
     * 设置读取和存入的key
     *
     * @param from
     * @param to
     */
    public AdapterDownLoadConversoinPipeline(String from, String to) {
        super(from, to);
    }

    @Override
    protected Object downLoadStore(InputStream inputStream, URL url) throws Exception {
        String fileName = null;
        Object useUrl = null;
        try {
            fileName = this.toLastFileName(url);
            useUrl = downLoadStore(inputStream,fileName);
        } finally {
            logger.debug("正在下载文件地址=[{}],上传的文件名为=[{}],可供使用的地址为=[{}]",url,fileName,useUrl);
        }
        return useUrl;
    }

    protected abstract Object downLoadStore(InputStream inputStream, String fileName) throws Exception;

    /**
     * 获得文件名。
     * @see AdapterDownLoadConversoinPipeline#setUsePath(boolean)
     * @param url http://www.mmonly.cc/ktmh/hzw/list_34_1.html
     * @return list_34_1.html 或者 /ktmh/hzw/list_34_1.html
     */
    public final String toLastFileName(URL url) {
        String  fileName;
        if(this.usePath){
            fileName = url.getPath();
        }else{
            // 获得安全的url字符串
            String urlStr = StrUtil.utf8Str(url);
            // 获得fileName
            String[] splits = StrUtil.splitToArray(urlStr, '/');
            fileName = splits[splits.length - 1];
        }
        return fileName;
    }

    /**
     * 获得文件文件名时：
     * 是否使用 url.getPath(); 全名称。
     * @param usePath
     */
    public void setUsePath(boolean usePath) {
        this.usePath = usePath;
    }
}
